﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoBastanteo.Persistencia;
using ProyectoBastanteo.Dominio;
using NUnit.Framework;

namespace ProyectoBastanteo.Prueba
{
    [TestFixture]
    public class BastanteoDAOPrueba
    {

        BastanteoDAO basDAO = new BastanteoDAO();
        ClienteDAO oClienteDAO = new ClienteDAO();
        Cliente ocliente = new Cliente();
        
        TipoEmpresa tipoEmpresa = null;
        TipoempresaDAO tipoEmpresaDAO = null;
        Cliente clienteinicia = null;
        ClienteDAO clienteDAO = null;
        Poderes poderinicia = null;
        PoderesDAO poderDAO = null;

        PoderesDAO oPoderesDAO = new PoderesDAO();
        Poderes opoderes = new Poderes();


        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            tipoEmpresaDAO = new TipoempresaDAO();
            clienteDAO = new ClienteDAO();
            poderDAO = new PoderesDAO();

            
            tipoEmpresa = tipoEmpresaDAO.Crear(new TipoEmpresa() { Abreviacion = "SRL" });
            
            clienteinicia = clienteDAO.Crear(new Cliente()
            {
                rucclie = "256428543",
                razclie = "Indeco",
                fecini = DateTime.Now,
                tipclie = tipoEmpresa,
                nroempl = 850
            });

            poderinicia = poderDAO.Crear(new Poderes()
            {
                codpod = "REEF",
                nompod = "Retiro Efectivo",
                tippod = "Activo",
            });
            
            opoderes = oPoderesDAO.Obtener("REEF");
            ocliente = oClienteDAO.Obtener(1);

        }
        
        [Test]
        public void Test1_Crear()
        {
            Bastanteo bastanteoXCrear = new Bastanteo();
                         

            bastanteoXCrear.codclie = null;
            bastanteoXCrear.grubast = "A";
            bastanteoXCrear.codpode = opoderes;
            bastanteoXCrear.tipoint = "S";
            bastanteoXCrear.importe = 11500;
            bastanteoXCrear.fecvenc = DateTime.Now;

            Bastanteo BastanteoCreado = null;

            Assert.Catch<Exception>(delegate
            {
                BastanteoCreado = basDAO.Crear(bastanteoXCrear);
            });

            bastanteoXCrear.codclie = ocliente;

            Assert.DoesNotThrow(delegate
            {
                BastanteoCreado = basDAO.Crear(bastanteoXCrear);
            });

            // se hacen prueba 
            Assert.IsNotNull(BastanteoCreado);
            Assert.AreEqual(BastanteoCreado.codclie.codclie, 1);
            Assert.AreEqual(opoderes.codpod, "REEF");
            Assert.Greater(BastanteoCreado.importe, 1000);
            
        }

        [Test]
        public void Test2_Obtener()
        {
            Bastanteo bastanteoObtenido = null;
            // 1. Validar que se retorne nulo al obtener un bastanteo inexistente
            Assert.DoesNotThrow(delegate
            {
                bastanteoObtenido = basDAO.Obtener(ocliente, "T", opoderes); 
            });
            Assert.IsNull(bastanteoObtenido);
            // 2. Validar que se obtenga el bastanteo creado satisfactoriamente
            Assert.DoesNotThrow(delegate
            {
                bastanteoObtenido = basDAO.Obtener(ocliente, "A", opoderes);
            });
            Assert.IsNotNull(bastanteoObtenido);

        }

        [Test]
        public void Test3_Modificar()
        {
            Bastanteo bastanteoAModificar = basDAO.Obtener(ocliente,"A",opoderes);
            double importeGuardado = bastanteoAModificar.importe;

            bastanteoAModificar.importe = 7000;
            bastanteoAModificar.fecvenc = DateTime.Now ;
            Bastanteo BastanteoModificado = null;
            Assert.DoesNotThrow(delegate
            {
                BastanteoModificado = basDAO.Modificar(bastanteoAModificar);
            });
            Assert.IsNotNull(BastanteoModificado);
            Assert.AreNotEqual(importeGuardado, BastanteoModificado.importe);
            
        }

        [Test]
        public void Test4_Eliminar()
        {
            Bastanteo BastanteoAEliminar = basDAO.Obtener(ocliente, "A", opoderes);
            Assert.DoesNotThrow(delegate
            {
                basDAO.Eliminar(BastanteoAEliminar);
            });
            Bastanteo BastanteoEliminado = basDAO.Obtener(ocliente, "A", opoderes);
            Assert.IsNull(BastanteoEliminado);
        }

        [Test]
        public void Test5_Listar()
        {
            basDAO.Crear(new Bastanteo() { codclie = oClienteDAO.Obtener(1), grubast = "A", codpode = oPoderesDAO.Obtener("REEF") ,tipoint  ="S", fecvenc = DateTime.Now,  importe = 1000 });
            basDAO.Crear(new Bastanteo() { codclie = oClienteDAO.Obtener(1), grubast = "B", codpode = oPoderesDAO.Obtener("REEF"), tipoint = "S", fecvenc = DateTime.Parse("2015-01-01"), importe = 1800 });
            ICollection<Bastanteo> bastanteosExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                bastanteosExistentes = basDAO.ListarTodos();
            });
            Assert.GreaterOrEqual(bastanteosExistentes.Count, 2);

            foreach (Bastanteo obastanteo in bastanteosExistentes)
            {
                Assert.IsNotNull(obastanteo.grubast);
            }
           
        }

    }
}